package com.aug_leo.datastructure.binarytree;

/**
 * 对称二叉树
 */
public class E04Leetcode101 {

    /**
     * 判断给定二叉树是否对称
     * 通过调用辅助函数check来比较树的左子树和右子树是否镜像对称
     *
     * @param root 二叉树的根节点
     * @return 如果二叉树对称返回true，否则返回false
     */
    public boolean isSymmetric(TreeNode root) {
        return check(root.left, root.right);
    }

    /**
     * 递归检查二叉树的左子树和右子树是否镜像对称
     *
     * @param left  左子节点
     * @param right 右子节点
     * @return 如果左子树和右子树镜像对称则返回true，否则返回false
     */
    private boolean check(TreeNode left, TreeNode right) {
        // 如果左右子节点都为空，则是对称的
        if (left == null && right == null) {
            return true;
        }
        // left 和 right 不能同时为null
        // 如果左右子节点其中一个为空，另一个不为空，则不对称
        if (right == null || left == null) {
            return false;
        }
        // 如果左右子节点的值不相等，则不对称
        if (left.val != right.val) {
            return false;
        }

        // 递归检查左子树的左子节点和右子树的右子节点，以及左子树的右子节点和右子树的左子节点是否对称
        return check(left.left, right.right) && check(left.right, right.left);
    }

    // 1, 2, 2, 3, 4, 4, 3, 5, 6, 7, 8, 8, 7, 6, 5
}
